" ============================================================================
.\" Modified Sat Jan 14 13:38:30 CST 2017 by caiwang213
.\"   <caiwang213@qq.com>
.\"
.TH git-flow 2 2017-01-13 "Linux" "Linux Programmer's Manual"
.SH NAME
git-flow \- linux git tool
.SH [获取取远端分支3个方法] 
.PD 0
.TP 55
.B 1. $ git checkout -b develop-john origin/develop-john
从远程分支origin/develop-john创建本地分支develop-john，并切换到develop-john，该操作默认已关联本地develop-john分支的upstream分支为origin/develop-john(可以用git config --list查看)，可以直接进行git push/pull操作.

.TP
.B 2. $ git fetch origin develop-john:develop-john
.TP
.B  \& \& \& $ git push -u origin develop-john
关联本地develop-john分支的upstream分支为origin/develop-john(可以用git config --list查看)，可以直接进行git push/pull操作.
.TP
.B  \& \& \& $ git checkout develop-john
.BR

.TP
.B 3. $ git fetch origin develop-john:develop-john
.TP
.B  \& \& \& $ git push --set-upstream origin develop-john
关联本地develop-john分支的upstream分支为origin/develop-john(可以用git config --list查看)，可以直接进行git push/pull操作.
.TP
.B  \& \& \& $ git checkout develop-john
.BR

.SH [创建远程分支3个方法] 
.PD 0
.TP 55 
.B 1. $ git branch develop
.TP
.B  \& \& \& $ git push -u origin develop
-u参数 关联本地develop分支的upstream分支为origin/develop
.TP
.B  \& \& \& $ git checkout develop

.TP
.B 2. $ git checkout -b develop
.TP
.B \& \& \& $ git push --set-upstream origin develop
--set-upstream 参数 关联本地develop分支的upstream分支为origin/develop

.SH [删除远程分支2个方法] 
.PD 0
.TP 55
.B 1. $ git branch -r -d orgin/dev-john
不能真正删除!! 只上清除git branch -r清单记录，git pull还可以拉取下来

.TP
.B 2. $ git push origin :dev-john
真正删除! 其他用户可以用git remote prune origin 进行更新

.SH [git fetch详解,4种用法] 
.TP 55
.TP 
.B 1. $ git fetch
更新git remote中远程origin下所有分支的最新commit-id, 将其记录到.git/FETCH_HEAD文件中(如果原来有会将原来的覆盖)，第一行为当前所有分支对应的最新commit-id,并且指定当前分支为后面merge操作的默认分支

.TP
.B 2. $ git fetch origin
等同git fetch

.TP
.B 3. $ git fetch origin develop-john
更新名称为origin的远程repo上的分支develop-john最新commit-id, 将其记录到.git/FETCH_HEAD文件中(如果原来有会将原来的覆盖, 记录将会只有一条)

.TP 
.B 4. $ git fetch origin develop-john:develop-jessica
更新名称为origin的远程repo上的分支develop-john最新commit-id, 将其记录到.git/FETCH_HEAD文件中(如果原来有会将原来的覆盖, 记录将会只有一条),并在本地创建develop-jessica分支

.SH [git push/pull与upstream & downstream] 
.PD 0
.TP
参考
.I https://segmentfault.com/a/1190000002783245


.SH [Gitflow工作流] 
.TP 55
.TP 
.B 1. 添加项目组、组员
.TP
.B \& \& \& $ sudo groupadd git
.TP
.B \& \& \& $ sudo usermod -G git caiwang213
.TP
.B \& \& \& $ sudo useradd -g git wanke
.TP
.B \& \& \& $ sudo passwd wanke
.TP
.B \& \& \& $ sudo useradd -g git jieyingda
.TP
.B \& \& \& $ sudo passwd jieyingda
.TP
.B \& \& \& $ sudo vi /etc/passwd
#修改wanke、jieyingda登录bash为/usr/local/bin/git-bash，只允许下载和上传代码，不允许登录

.TP 
.B 2. caiwang213(代码审核者)创建中央仓库
.TP
.B \& \& \& $ su git 
.TP
.B \& \& \& $ mkdir -p /home/git/repos/git-flow.git
.TP
.B \& \& \& $ chgrp git /home/git/repos/
.TP
.B \& \& \& $ chmod g+s /home/git/repos/
.TP
.B \& \& \& $ cd /home/git/repos/
.TP
.B \& \& \& $ git init --bare git-flow.git
.BR

.TP 
.B 3. caiwang213(代码审核者/管理者)
.TP
.B \& \& \& $ cd workspace/git
.TP
.B \& \& \& $ git clone caiwang213@192.168.60.99:/home/git/repos/git-flow.git
.TP
.B \& \& \& $ cd git-flow
.TP
.B \& \& \& $ touch README.md
.TP
.B \& \& \& $ git add README.md
.TP
.B \& \& \& $ git commit -am "caiwang213 add README.md"
#裸仓库默认啥分支都没有,要自己创建一个文件提交后才会成生默认master分支, master分支存储了正式发布的历史.
.TP
.B \& \& \& $ git push
.TP
.B \& \& \& $ git checkout -b develop
.TP
.B \& \& \& $ git push -u origin develop
#创建develop分支. develop分支作为功能的集成分支. 

.TP 
.B 3. wanke(开发者1)克隆、获取develop、创建功能分支feature-a
.TP
.B \& \& \& $ cd workspace/git
.TP
.B \& \& \& $ git clone wanke@192.168.60.99:/home/git/repos/git-flow.git
.TP
.B \& \& \& $ cd git-flow
.TP
.B \& \& \& $ git checkout -b develop origin/develop
#其它开发者这时应该克隆中央仓库，建好develop分支的跟踪分支
.TP
.B \& \& \& $ git checkout -b feature-a develop
#wanke 创建功能分支. 功能分支不是从master分支上拉出新分支，而是使用develop分支作为父分支. 当新功能完成时，合并回develop分支. 新功能提交应该从不直接与master分支交互. 每个新功能位于一个自己的分支，这样可以push到中央仓库以备份和协作.

.TP 
.B 3. wanke(开发者1)进行功能feature-a开发,开发完成后自行合并至develop
.TP
.B \& \& \& $ git checkout feature-a
.TP
.B \& \& \& $ git add <some-file>
.TP
.B \& \& \& $ git commit ...
.TP
.B \& \& \& $ git push origin feature-a
#功能分支也可以(且应该)push到中央仓库中。推送到中央仓库有2个好处. 1、备份 2、共享,发送pull request 管理者可以审查是否需要再修改，然后由管理者去合并到主分支中
.I 最重要的是要让代码完审核人可以随时审查开发人员代码

.TP 
.B 4. wanke(开发者1)rebase 功能分支合并至develop
.TP
.B \& \& \& $ git checkout develop
.TP
.B \& \& \& $ git pull
.TP
.B \& \& \& $ git checkout feature-a
.TP
.B \& \& \& $ git rebase -i develop
#先合并在本地功能分支, 注意要用-i 命令多个commit-id合并, 使develop尽量精减.中间用git mergetool解决冲突
.TP
.B \& \& \& $ git rebase --continue
#多次执行该命令直到没有冲突，冲突处理不好用git rebase --abort回到git rebase -i develop之前状态
.TP
.B \& \& \& $ git checkout develop
.TP
.B \& \& \& $ git merge feature-a
.TP
.B \& \& \& $ git push


